package cn.sc.summer.mybatis.properties;

import lombok.Data;

/**
 * 类名：多数据源属性
 *
 * @author a-xin
 * @date 2024/7/30 14:48
 */
@Data
public class DataSourceProperties {

    /**
     * 这一项可配可不配，如果不配置druid会根据url自动识别dbType，然后选择相应的driverClassName
     */
    private String driverClassName;

    /**
     * 连接数据库的url，不同数据库不一样。例如：mysql : jdbc:mysql://10.20.153.104:3306/druid2、oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
     */
    private String url;

    /**
     * 连接数据库的用户名
     */
    private String username;

    /**
     * 连接数据库的密码
     */
    private String password;

    //---------------------------------------------Druid默认参数---------------------------------------------//

    /**
     * 初始化连接大小
     */
    private int initialSize = 5;

    /**
     * 最大连接数
     */
    private int maxActive = 30;

    /**
     * 最小空闲连接数
     */
    private int minIdle = 10;

    /**
     * 获取连接时最大等待时间，单位毫秒。配置了maxWait之后，缺省启用公平锁，并发效率会有所下降，如果需要可以通过配置useUnfairLock属性为true使用非公平锁。缺省值为-1
     */
    private long maxWait = 60 * 100L;

    /**
     * 有两个含义：1) Destroy线程会检测连接的间隔时间，如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据。缺省值为60s
     */
    private long timeBetweenEvictionRunsMillis = 2 * 1000L;

    /**
     * 连接空闲时间大于该值并且池中空闲连接数大于minidle则关闭这个连接。缺省值为30分钟
     */
    private long minEvictableIdleTimeMillis = 1000L * 60L * 30L;

    /**
     * 连接空闲时间大于该值，不管minidle是多少都关闭这个连接。缺省值为7小时
     */
    private long maxEvictableIdleTimeMillis = 1000L * 60L * 60L * 7;

    /**
     * 用来检测连接是否有效的sql，要求是一个查询语句，常用select ‘x’。如果validationQuery为null，testOnBorrow、testOnReturn、testWhileIdle都不会起作用。缺省值为null
     */
    private String validationQuery = "select 1";

    /**
     * 单位：秒，检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法。缺省值为-1
     */
    private int validationQueryTimeout = -1;

    /**
     * 申请连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能。缺省值为true
     */
    private boolean testOnBorrow = false;

    /**
     * 归还连接时执行validationQuery检测连接是否有效，做了这个配置会降低性能。缺省值为false
     */
    private boolean testOnReturn = false;

    /**
     * 建议配置为true，不影响性能，并且保证安全性。申请连接的时候检测，如果空闲时间大于timeBetweenEvictionRunsMillis，执行validationQuery检测连接是否有效。缺省值为false
     */
    private boolean testWhileIdle = true;

    /**
     * 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
     */
    private boolean poolPreparedStatements = false;
    private int maxOpenPreparedStatements = -1;
    private boolean sharePreparedStatements = false;

    /**
     * 连接池中的minIdle数量以内的连接，空闲时间超过minEvictableIdleTimeMillis，则会执行keepAlive操作
     */
    private boolean keepAlive = true;

    /**
     * 启用内置过滤器（第一个 stat必须，否则监控不到SQL）##########
     */
    private String filters = "stat,log4j2";
}

